home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2005 October
/
PCWOCT05.iso
/
Software
/
FromTheMag
/
XAMPP 1.4.14
/
xampp-win32-1.4.14-installer.exe
/
xampp
/
php
/
pear
/
Text
/
Word.php
< prev
Wrap
PHP Script
|
2004-03-24
|
5KB
|
164 lines
<?php
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩|
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩|
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,╩╩╩╩╩╩╩|
// | that is bundled with this package in the file LICENSE, and is╩╩╩╩╩╩╩╩|
// | available at through the world-wide-web at╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩|
// | http://www.php.net/license/2_02.txt.╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩|
// | If you did not receive a copy of the PHP license and are unable to╩╩╩|
// | obtain it through the world-wide-web, please send a note to╩╩╩╩╩╩╩╩╩╩|
// | license@php.net so we can mail you a copy immediately.╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩|
// +----------------------------------------------------------------------+
// | Author: George Schlossnagle <george@omniti.com> |
// +----------------------------------------------------------------------+
//
// $Id$
/*
* Text_Word calculates the number of syllables in a word, based off of
* the number of contiguous vowel groupings in the word and applying
* matches to detect special cases.
* require_once 'Text/Word.php'
* $word = new Text_Word('word');
* $word->numSyllables(); // returns 1
*
* @package Text_Word
* @author George Schlossnagle <george@omniti.com>
*/
class Text_Word {
/* The word
*
* @var string
* @access public
*/
var $word;
/* The number of syllables. This is internal, the value should be
* accessed through the accessor.
*
* @var number
* @access protected
*/
var $_numSyllables = 0;
/* The special cases of fragments which detect as 1 but should be 2
* syllables.
*
* @var array
* @access static protected
*/
var $doubleSyllables = array('/\wlien/', // alien but not lien
'/bl$/', // syllable
'/io/', // biography
);
/* The special cases of fragments which detect as 2 but should be 1
* syllables.
*
* @var array
* @access static protected
*/
var $silentSyllables = array('/\wely$/', // absolutely but not ely
'/\wion/',
'/iou/',
);
/*
* Constructs a word by name.
*
* @param string
* @access public
*/
function Text_Word($name = '')
{
$this->word = $name;
}
/*
* Helper function, canocalizes the word.
*
* @param string
* @access protected
*/
function _mungeWord($scratch)
{
// conanonicalize the word
$scratch = strtolower($scratch);
// trailings e's are almost always silent in English
// so remove them
$scratch = preg_replace("/e$/", "", $scratch);
return $scratch;
}
/*
* Helper function, counts syllable exceptions
*
* @param string
* @access protected
*/
function _countSpecialSyllables($scratch)
{
$mod = 0;
// decrement our syllable count for words that contain
// 'silent' syllables, e.g. ely in 'abosultely'
foreach( $this->silentSyllables as $pat ) {
if(preg_match($pat, $scratch)) {
$mod--;
}
}
// increment syllable count for certain conjoined vowel
// patterns which produce two syllables e.g.
// 'io' in 'biology'
foreach( $this->doubleSyllables as $pat ) {
if(preg_match($pat, $scratch)) {
$mod++;
}
}
return $mod;
}
/*
* Returns the number of syllables. Caches the value in the object.
*
* @access public
*/
function numSyllables()
{
// cache the value in this object
if($this->_numSyllables) {
return $this->_numSyllables;
}
$scratch = $this->_mungeWord($this->word);
// Split the word on the vowels. a e i o u, and for us always y
$fragments = preg_split("/[^aeiouy]+/", $scratch);
// remove null elements at the head and tail of
// $fragments
if(!$fragments[0]) {
array_shift($fragments);
}
if(!$fragments[count($fragments) - 1]) {
array_pop($fragments);
}
// modify our syllable count for special cases
$this->_numSyllables += $this->_countSpecialSyllables($scratch);
// now count our syllable
if(count($fragments)) {
$this->_numSyllables += count($fragments);
}
else {
$this->_numSyllables = 1;
}
return $this->_numSyllables;
}
}
?>